package plp.expressions1.expression;

import plp.expressions1.util.LinguagemVisitor;
import plp.expressions1.util.Tipo;
import plp.expressions1.util.TipoPrimitivo;
import plp.expressions1.util.VisitorException;
import plp.expressions1.util.VisitorExpressoes1;

/**
 * Um objeto desta classe representa uma Expressao de tamanho de String.
 */
public class ExpLength extends ExpUnaria {

	/**
	 * Controi uma Expressao de tamanho  com a expressao especificada
	 * assume-se que <code>exp</code> &eacute; uma expressao cuja avaliacao
	 * resulta num <code>ValorString</code>
	 */
	
	public ExpLength(Expressao exp) {
		super(exp, "length");
	}

	//--------------------------------------------------------------------------------------------------
	//-----------------Construtor para utilizacao da selecao dos erros no editor.-----------------------
	public ExpLength(Expressao exp, int line, int beginColumn, int endColumn) 
	{
		super(exp, "length");
		this.line = line;
		this.beginColumn = beginColumn;
		this.endColumn = endColumn;
	}//--------------------------------------------------------------------------------------------------	
	
	/**
	 * Retorna o valor da Expressao de tamanho.
	 */
	public Valor avaliar(){
		return new ValorInteiro (((ValorString)getExp().avaliar()).valor().length());
	}

	/**
	 * Realiza a verificacao de tipos desta expressao.
	 *
	 * @return <code>true</code> se os tipos da expressao sao validos;
	 *          <code>false</code> caso contrario.
	 * @throws VisitorException 
	 */
	public boolean checaTipoElementoTerminal() throws VisitorException {
		//return (getExp().getTipo().eString());
		
		boolean Result = (getExp().getTipo().eString());
		if (!Result) accept(visit);
		return Result;
	}

	/**
	 * Retorna os tipos possiveis desta expressao.
	 *
	 * @return os tipos possiveis desta expressao.
	 */
	public Tipo getTipo() {
		return TipoPrimitivo.INTEIRO;
	}
}
